package controller

import (
	"github.com/gin-gonic/gin"
	"k8s-dash/dto"
	"k8s-dash/middleware"
	"k8s-dash/service"
	"k8s-dash/utils"
	"k8s-dash/utils/logger"
)

type podController struct{}

var PodController podController

func (p *podController) Register(ginRouter *gin.RouterGroup) {
	pc := &podController{}
	ginRouter.GET("/k8s/pod/list", pc.GetPodList)
	ginRouter.GET("/k8s/pod/detail", pc.GetPodDetail)
	ginRouter.DELETE("/k8s/pod/delete", pc.DeletePod)
	ginRouter.PATCH("/k8s/pod/update", pc.UpdatePod)
	ginRouter.GET("/k8s/pod/container", pc.GetContainerName)
	ginRouter.GET("/k8s/pod/numnp", pc.GetPodsToNS)
	ginRouter.GET("/k8s/pod/log", pc.GetPodLog)
	ginRouter.GET("/k8s/pod/webshell", pc.WebShell)
}

// GetPodList 获取pod，支持分页过滤排序
// ListPage godoc
// @Summary      获取pod列表
// @Description  获取pod列表
// @Tags         pod
// @ID           /api/k8s/pod/list
// @Accept       json
// @Produce      json
// @Param        filter_name  query  string  false  "过滤"
// @Param        namespace    query  string  false  "命名空间"
// @Param        page         query  int     false  "页码"
// @Param        limit        query  int     false  "分页限制"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": service.PodsResp}"
// @Router       /api/k8s/pod/list [get]
func (p *podController) GetPodList(ctx *gin.Context) {
	parmas := &dto.PodListInput{}
	//参数验证
	err := parmas.BindValidate(ctx)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
		return
	}
	podList, err := service.Pod.GetPodList(parmas.FilterName, parmas.NameSpace, parmas.Limit, parmas.Page)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, podList)
}

// GetPodDetail 获取pod详情
// ListPage godoc
// @Summary      获取pod详情
// @Description  获取pod详情
// @Tags         pod
// @ID           /api/k8s/pod/detail
// @Accept       json
// @Produce      json
// @Param        pod_name  query  string  true  "pod名字"
// @Param        namespace    query  string  true  "命名空间"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": coreV1.Pod}"
// @Router       /api/k8s/pod/detail [get]
func (p *podController) GetPodDetail(ctx *gin.Context) {
	parmas := &dto.PodInputDto{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	podDetail, err := service.Pod.GetPodDetail(parmas.PodName, parmas.NameSpace)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, podDetail)
}

// DeletePod 删除Pod
// ListPage godoc
// @Summary      删除Pod
// @Description  删除Pod
// @Tags         pod
// @ID           /api/k8s/pod/delete
// @Accept       json
// @Produce      json
// @Param        pod_name  query  string  true  "pod名字"
// @Param        namespace    query  string  true  "命名空间"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": nil}"
// @Router       /api/k8s/pod/delete [delete]
func (p *podController) DeletePod(ctx *gin.Context) {
	parmas := &dto.PodInputDto{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	err := service.Pod.DeletePod(parmas.PodName, parmas.NameSpace)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.DeleteError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.DeleteError, err))
		return
	}
	middleware.ResponseSuccess(ctx, nil)
}

// UpdatePod 更新Pod
// ListPage godoc
// @Summary      更新Pod
// @Description  更新Pod
// @Tags         pod
// @ID           /api/k8s/pod/update
// @Accept       json
// @Produce      json
// @Param        content  query  string  true  "更新内容"
// @Param        namespace    query  string  true  "命名空间"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": nil}"
// @Router       /api/k8s/pod/update [patch]
func (p *podController) UpdatePod(ctx *gin.Context) {
	parmas := &dto.PodUpdateInput{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	err := service.Pod.UpdatePod(parmas.NameSpace, parmas.Content)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.UpdateError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.UpdateError, err))
		return
	}
	middleware.ResponseSuccess(ctx, nil)
}

// GetContainerName 获取pod下容器名字
// ListPage godoc
// @Summary      获取pod下容器名字
// @Description  获取pod下容器名字
// @Tags         pod
// @ID           /api/k8s/pod/container
// @Accept       json
// @Produce      json
// @Param         pod_name  query  string  true  "pod名字"
// @Param        namespace    query  string  true  "命名空间"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": nil}"
// @Router       /api/k8s/pod/container [get]
func (p *podController) GetContainerName(ctx *gin.Context) {
	parmas := &dto.PodInputDto{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	containerNames, err := service.Pod.GetContainerName(parmas.PodName, parmas.NameSpace)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, containerNames)
}

// GetPodLog 获取pod日志
// ListPage godoc
// @Summary      获取pod日志
// @Description  获取pod日志
// @Tags         pod
// @ID           /api/k8s/pod/log
// @Accept       json
// @Produce      json
// @Param         container_name  query  string  true  "容器名字"
// @Param         pod_name  query  string  true  "pod名字"
// @Param        namespace    query  string  true  "命名空间"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": string}"
// @Router       /api/k8s/pod/log [get]
func (p *podController) GetPodLog(ctx *gin.Context) {
	parmas := &dto.PodGetLogInput{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	podLog, err := service.Pod.GetPodLog(parmas.ContainerName, parmas.PodName, parmas.NameSpace)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, podLog)
}

// GetPodsToNS 获取ns下pod数量
// ListPage godoc
// @Summary      获取ns下pod数量
// @Description  获取ns下pod数量
// @Tags         pod
// @ID           /api/k8s/pod/podNP
// @Accept       json
// @Produce      json
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": string}"
// @Router       /api/k8s/pod/podNP [get]
func (p *podController) GetPodsToNS(ctx *gin.Context) {
	podsToNS, err := service.Pod.GetPodsToNS()
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, podsToNS)
}

func (p *podController) WebShell(ctx *gin.Context) {
	ops := &dto.WebShellOptions{}
	if err := ops.BindingValidParams(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	if err := service.Pod.WebShellHandler(ops, ctx.Writer, ctx.Request); err != nil {
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
}
